import java.util.ArrayList;
import java.util.List;

class PascalTriangle {

    /**
     *      方法： 使用动态规划生成杨辉三角
     *             每一行的首尾元素都是1
     *             中间的元素是上一行相邻两个元素的和
     *
     *      Args:
     *          numRows: int - 需要生成的杨辉三角的行数
     *
     *      Returns:
     *          List[List[int]]: 生成的杨辉三角，每个子列表表示一行
     *
     *      Time: O(numRows^2) - 需要生成的元素总数是(1+numRows)*numRows/2
     *
     *      Space: O(1) - 不考虑返回值占用的空间，只使用了常数级别的额外空间
     */
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> c = new ArrayList<>(numRows);
        c.add(List.of(1));
        for(int i = 1; i < numRows; i++){
            List<Integer> row = new ArrayList<>(i + 1);
            row.add(1);
            for (int j = 1; j < i; j++){
                //c[i][j] = c[i-1][j-1] + c[i-1][j]
                row.add(c.get(i-1).get(j-1) + c.get(i-1).get(j));
            }
            row.add(1);
            c.add(row);
        }
        return c;
    }
}